package com.ledi.guns.modular.ledipay.service.impl;

import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import lombok.extern.slf4j.Slf4j;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.ledi.guns.common.exception.AppCheckException;
import com.ledi.guns.common.exception.BizExceptionEnum;
import com.ledi.guns.common.exception.BussinessException;
import com.ledi.guns.common.persistence.dao.UserMapper;
import com.ledi.guns.common.persistence.model.User;
import com.ledi.guns.common.util.StringUtil;
import com.ledi.guns.core.base.tips.Tip;
import com.ledi.guns.core.redis.KeyValueDAO;
import com.ledi.guns.core.shiro.ShiroKit;
import com.ledi.guns.core.shiro.ShiroUser;
import com.ledi.guns.core.util.FileUtil;
import com.ledi.guns.core.util.HttpUtil;
import com.ledi.guns.core.util.SystemConstans;
import com.ledi.guns.core.util.TimeUtil;
import com.ledi.guns.modular.ledipay.service.IUserService;

/**
 * 文件名称： com.ledi.guns.modular.system.service.impl.IUserServicceImpl.java<br/>
 * 初始作者： 钟小平<br/>
 * 创建日期： 2017年12月5日<br/>
 * 功能说明： 用户service实现 <br/>
 * =================================================<br/>
 * 修改记录：<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (乐迪教育科技有限公司-幼儿事业部) 2017-2018.All rights reserved.<br/>
 */
@Service
@Slf4j
public class IUserServiceImpl implements IUserService {

	protected final static Logger logger = LoggerFactory.getLogger(IUserServiceImpl.class);
	@Resource
	UserMapper userMapper;
	@Resource
	private KeyValueDAO keyValueDAO;
	@Value("${ledi.sms.url}")
	private String smsUrl;

	@Value("${cos.appid}")
	private String cosAppid;

	@Value("${cos.secret.id}")
	private String cosSecretId;

	@Value("${cos.secret.key}")
	private String cosSecretKey;

	@Value("${cos.region}")
	private String cosRegion;

	@Value("${cos.bucket.name}")
	private String cosBucketName;

	@Value("${cos.file.root.url}")
	private String cosFileRootUrl;

	/**
	 * 方法描述: [忘记密码获取发送短信验证码.]<br/>
	 * 初始作者: 钟小平<br/>
	 * 创建日期: 2017年12月5日-下午2:41:57<br/>
	 * 开始版本: 2.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 */
	@Override
	public void forgetPassword(String mobile) {

		if (StringUtil.isNoneBlank(mobile)) {

			if (StringUtil.isMobile(mobile)) {
				// SmsMessageReq param = new SmsMessageReq();
				Map<String, Object> columnMap = new HashMap<>();
				columnMap.put("phone", mobile);
				List<User> ulist = userMapper.selectByMap(columnMap);

				if (ulist.size() == 0) {
					throw new AppCheckException("system.user.mobile.noteixt.code", "system.user.mobile.noteixt.message");

				}
				List<String> list = new ArrayList<>();
				list.add(ulist.get(0).getName());
				String random = ShiroKit.getRandomSalt(5);
				String heartbeatTime = TimeUtil.addMinutes(TimeUtil.now(), 2);
				long time = 0;
				try {
					time = TimeUtil.getTime(heartbeatTime, TimeUtil.SOURCE_1);
				} catch (ParseException e) {
					e.printStackTrace();
				}
				String exitkaptcha = keyValueDAO.get(SystemConstans.USER_KAPTCHA_KEY.replaceAll("\\{0\\}", mobile));

				keyValueDAO.set(SystemConstans.USER_KAPTCHA_KEY.replaceAll("\\{0\\}", mobile), random, time);
				list.add(random);
				HashMap<String, String> param = new HashMap<>();
				param.put("mobile", mobile);
				param.put("templateType", "0");
				param.put("msgKey", "pay.user.kaptcha");
				param.put("params", JSON.toJSONString(list.toArray()));
				String response = HttpUtil.post(smsUrl, "utf-8", param);
				logger.info("发送短信响应：{}", response);
				Tip tip = JSON.parseObject(response, Tip.class);
				if (tip.getCode() != 200) {
					// 如果验证不通过，设置原来的验证码
					if (StringUtil.isNoneBlank(exitkaptcha)) {
						keyValueDAO.set(SystemConstans.USER_KAPTCHA_KEY.replaceAll("\\{0\\}", mobile), exitkaptcha, time);
					}
					throw new AppCheckException("system.user.mobile.kaptcha.error.code", tip.getMessage());

				}
				System.out.println(response);
			} else {
				throw new AppCheckException("system.user.mobile.format.code", "system.user.mobile.format.message");
			}

		} else {
			throw new AppCheckException("system.user.mobile.notBlank.code", "system.user.mobile.notBlank.message");
		}

	}

	/**
	 * 方法描述: [校验用户手机和验证码.]<br/>
	 * 初始作者: 钟小平<br/>
	 * 创建日期: 2017年12月5日-下午3:59:30<br/>
	 * 开始版本: 2.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 */
	@Override
	public void checkUserKaptcha(String mobile, String password, String kaptcha) {

		if (StringUtil.isNoneBlank(mobile)) {

			if (StringUtil.isMobile(mobile)) {
				Map<String, Object> columnMap = new HashMap<>();
				columnMap.put("phone", mobile);
				List<User> ulist = userMapper.selectByMap(columnMap);
				if (ulist.size() == 0) {
					throw new AppCheckException("system.user.mobile.noteixt.code", "system.user.mobile.noteixt.message");
				}
				String exitkaptcha = keyValueDAO.get(SystemConstans.USER_KAPTCHA_KEY.replaceAll("\\{0\\}", mobile));
				if (!StringUtil.equals(kaptcha, exitkaptcha)) {
					throw new AppCheckException("system.user.mobile.kaptcha.code", "system.user.mobile.kaptcha.message");
				}
				Wrapper<User> wrapper = new EntityWrapper<>();
				wrapper = wrapper.eq("phone", mobile);
				User user = ulist.get(0);
				String newMd5 = ShiroKit.md5(password, user.getSalt());
				user.setPassword(newMd5);
				Integer userUpdate = userMapper.update(user, wrapper);
				if (userUpdate < 1) {
					throw new AppCheckException("system.user.update.error", "system.user.update.message");
				} else {
					keyValueDAO.delete(SystemConstans.USER_KAPTCHA_KEY.replaceAll("\\{0\\}", mobile));
					logger.info("最后的值：{}", keyValueDAO.get(SystemConstans.USER_KAPTCHA_KEY.replaceAll("\\{0\\}", mobile)));
				}
			} else {
				throw new AppCheckException("system.user.mobile.format.code", "system.user.mobile.format.message");
			}

		} else {
			throw new AppCheckException("system.user.mobile.notBlank.code", "system.user.mobile.notBlank.message");
		}

	}

	/**
	 * 方法描述: [更新用户头像.]<br/>
	 * 初始作者: 钟小平<br/>
	 * 创建日期: 2018年9月12日-上午10:44:35<br/>
	 * 开始版本: 2.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 * 
	 * @throws IOException
	 */
	@Override
	public String updateUser(MultipartFile file) throws IOException {

		ShiroUser currentUser = ShiroKit.getUser();
		User oneUser = userMapper.selectById(currentUser.getId());
		if (!oneUser.getStatus().equals(SystemConstans.YES)) {
			throw new AppCheckException("school.user.notActive.code", "school.user.notActive.message");
		}
		if (file == null) {
			throw new AppCheckException("students.import.null.code", "students.import.null.message");
		}
		String fileName = file.getOriginalFilename();
		String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
		if (file.getBytes().length > 100 * 1024 * 1024) {
			throw new BussinessException(BizExceptionEnum.FILE_LENGTH_BIGGER);
		}
		String uploadFile = FileUtil.uploadFile(file, fileType, cosSecretId, cosSecretKey, cosBucketName, cosAppid);
		log.info("文件{}上传成功", uploadFile);
		oneUser.setAvatar(uploadFile);
		userMapper.updateById(oneUser);
		return uploadFile;
	}
}
